// **迭代器** 就是把集合中的所有元素按照顺序一个接一个的传递给处理逻辑。
//
// `Iterator` 特质有两个函数：
//
// - 一个是 `iter()`，用于返回一个 **迭代器** 对象，也称之为 **项 ( items )** 。
// - 一个是 `next()`，用于返回迭代器中的下一个元素。如果已经迭代到集合的末尾（最后一个项后面）则返回 `None`。


// | `iter()`      | 返回一个只读可重入迭代器，迭代器元素的类型为 `&T`       |
// | `into_iter()` | 返回一个只读不可重入迭代器，迭代器元素的类型为 `T`      |
// | `iter_mut()`  | 返回一个可修改可重入迭代器，迭代器元素的类型为 `&mut T` |
fn main() {
    let v = vec!["Rust入门指南", "Rust权威指南", "Rust项目实战"];
    let mut it = v.iter();
    println!("{:?}", it.next());
    println!("{:?}", it.next());
    println!("{:?}", it.next());
    println!("{:?}", it.next());

    for x in v.iter() {
        println!("{}", x)
    }
}


#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn test_shoes_in_my_size() {
        let shoes = vec![
            Shoe {
                size: 7,
                style: "sneaker".to_string(),
            },
            Shoe {
                size: 10,
                style: "sandal".to_string(),
            },
            Shoe {
                size: 6,
                style: "boot".to_string(),
            },
        ];
        assert_eq!(shoes_in_my_size(shoes, 10), vec![Shoe { size: 10, style: "sandal".to_string() }]);
    }
}